/**
283. 移动零

给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
请注意 ，必须在不复制数组的情况下原地对数组进行操作。

示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:
输入: nums = [0]
输出: [0]

进阶：你能尽量减少完成的操作次数吗？
 */

function swap(arr: number[], i: number, j: number) {
  [arr[i], arr[j]] = [arr[j], arr[i]];
}

// function moveZeroes(nums: number[]): void {
//   let startIndex = 99999999;
//   let endIndex = 0
//   let isStartFlag = true
//   for (let i = 0; i < nums.length; i++) {
//     if (isStartFlag && nums[i] !== 0) continue
//     if (nums[i] === 0) {
//       if (isStartFlag) {
//         isStartFlag = false
//         startIndex = i
//       } 
//     } else {
//       endIndex = i
//       if (endIndex - startIndex >= 1) {
//         swap(nums, startIndex, endIndex)
//         startIndex += 1
//       }
//     }
//   }
//   console.log(nums);
// };

var moveZeroes = function(nums: number[]) {
  let slow = 0
  for (let fast = 0; fast < nums.length; fast++) {
    if (nums[fast] !== 0) {
      nums[slow] = nums[fast]
      slow++
    }
  }             
  // console.log(nums, slow);
  nums.fill(0, slow)
};

moveZeroes([0,1,0,3,12])
